//!生命周期
//! 无论是资源的所有者还是资源的借用/引用，都存在在一个有效的存活时间或区间，这个时间区间称为生命周期

/* 生命周期
静态生命周期：'static,整个程序的持续时间,所有字符串字面值都是静态生命周期。
*/

pub fn life_cycel_demo() {
    {
        let r;
        {
            let x = 5;
            //r = &x; //报错,x的生命周期比r的生命周期短
            r = x;
        }
        println!("{}", r);
    }
}
/* 无法根据参数推断x,y和返回值 的周期
fn longest(x: &str, y: &str) -> &str {
    if x.len() > y.len() {
        x
    }else {
        y
    }
}
*/
//指定生命周期，添加生命周期标志 'a ,描述多个引用的生命周期的关系，但不影响生命周期
//输入生命周期: 函数参数
//输出生命周期: 函数返回值
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

pub fn life_cycel_demo2() {
    let s1 = String::from("abcd");
    let s2 = "xyz";
    let result = longest(s1.as_str(), s2);
    println!("{}", result);

    let s1 = String::from("abckd");
    let result = "";
    {
        let s2 = String::from("abcedadf");
        //result = longest(s1.as_str(), s2.as_str()); //报错，s2的生命周期太短了
    }

    println!("{}", result);
}

//结构体 指定生命周期

struct ImportantExpert<'a> {
    part: &'a str,
}

pub fn life_cycel_demo3() {
    let novel = String::from("Call me Ishmale. Some years ago.");
    let first_sentence = novel.split('.').next().expect("Could not found a '.'");

    let i = ImportantExpert {
        part: first_sentence,
    };

    /* 报错:string的生命周期太短
    let x;
    {
        let string = String::from("Call me Ishmale. Some years ago.");
        let ss = string.split('.').next().expect("Could not found a '.'");
        x = ImportantExpert { part: ss };
    }
     println!("{}", x.part);
      */
}
